package cn.cnf.common.utils;

import java.math.BigDecimal;

/**
 * BigDecimal 工具类
 *
 */
public class BigDecimalUtil {

    /**
     * BigDecimal 安全加法运算
     *
     * @return
     */
    public static BigDecimal safeAdd(BigDecimal b1, BigDecimal... bn) {
        if (null == b1) {
            b1 = BigDecimal.ZERO;
        }
        if (null != bn) {
            for (BigDecimal b : bn) {
                b1 = b1.add(null == b ? BigDecimal.ZERO : b);
            }
        }
        return b1;
    }

    /**
     * BigDecimal 安全减法运算
     *
     * @return
     */
    public static BigDecimal safeSubtract(BigDecimal b1, BigDecimal... bn) {
        if (null == b1) {
            b1 = BigDecimal.ZERO;
        }
        BigDecimal r = b1;
        if (null != bn) {
            for (BigDecimal b : bn) {
                r = r.subtract((null == b ? BigDecimal.ZERO : b));
            }
        }
        return r;
    }

    /**
     * BigDecimal 安全乘法运算
     *
     * @return
     */
    public static BigDecimal safeMultiply(BigDecimal b1, BigDecimal b2) {
        if (null == b1) { return BigDecimal.ZERO; }
        if (null == b2) { return BigDecimal.ZERO; }
        return b1.multiply(b2).setScale(4, BigDecimal.ROUND_HALF_UP); // 保留4位小数
    }

    /**
     * BigDecimal 安全除法运算
     *
     * @return
     */
    public static BigDecimal safeDivide(BigDecimal b1, BigDecimal b2) {
        if (null == b1 ||  null == b2) {
            return BigDecimal.ZERO;
        }
        try {
            return b1.divide(b2, 4, BigDecimal.ROUND_HALF_UP); // 保留4位小数
        } catch (Exception e) {
            return BigDecimal.ZERO;
        }
    }

    /**
     * 字符串转换BigDecimal
     *
     * @param value 值
     * @return
     */
    public static BigDecimal stringToBigDecimal(String value) {
        return new BigDecimal(value);
    }

    /**
     * 判断num1是否小于num2
     *
     * @param num1
     * @param num2
     * @return num1小于num2返回true
     */
    public static boolean lessThan(BigDecimal num1, BigDecimal num2) {
        if (null == num1) { num1 = BigDecimal.ZERO; }
        if (null == num2) { num2 = BigDecimal.ZERO; }
        return num1.compareTo(num2) == -1;
    }

    /**
     * 判断num1是否小于等于num2
     *
     * @param num1
     * @param num2
     * @return num1小于或者等于num2返回true
     */
    public static boolean lessEqual(BigDecimal num1, BigDecimal num2) {
        if (null == num1) { num1 = BigDecimal.ZERO; }
        if (null == num2) { num2 = BigDecimal.ZERO; }
        return (num1.compareTo(num2) == -1) || (num1.compareTo(num2) == 0);
    }

    /**
     * 判断num1是否大于num2
     *
     * @param num1
     * @param num2
     * @return num1大于num2返回true
     */
    public static boolean greaterThan(BigDecimal num1, BigDecimal num2) {
        if (null == num1) { num1 = BigDecimal.ZERO; }
        if (null == num2) { num2 = BigDecimal.ZERO; }
        return num1.compareTo(num2) == 1;
    }

    /**
     * 判断num1是否大于等于num2
     *
     * @param num1
     * @param num2
     * @return num1大于或者等于num2返回true
     */
    public static boolean greaterEqual(BigDecimal num1, BigDecimal num2) {
        if (null == num1) { num1 = BigDecimal.ZERO; }
        if (null == num2) { num2 = BigDecimal.ZERO; }
        return (num1.compareTo(num2) == 1) || (num1.compareTo(num2) == 0);
    }

    /**
     * 判断num1是否等于num2
     *
     * @param num1
     * @param num2
     * @return num1等于num2返回true
     */
    public static boolean equal(BigDecimal num1, BigDecimal num2) {
        if (null == num1) { num1 = BigDecimal.ZERO; }
        if (null == num2) { num2 = BigDecimal.ZERO; }
        return num1.compareTo(num2) == 0;
    }
}